package leetcode.One_hundred_to_Two_hundred;

/**
 * 验证回文串
 *
 * 给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。
 *
 * 说明：本题中，我们将空字符串定义为有效的回文串。
 */
public class Test125 {

    public static boolean isPalindrome(String s) {
        if (s.length() == 1) {
            return true;
        }
        s = s.toLowerCase();
        char[] charArray = s.toCharArray();
        int l = 0;
        int r = charArray.length - 1;
        while ( l <= r) {
            if (isCharacterOrNumber(charArray[l]) && isCharacterOrNumber(charArray[r])) {
                if (charArray[l++] != charArray[r--]) {
                    return false;
                }
            } else {
                // 排除非字母
                while (l <= r && !isCharacterOrNumber(charArray[l])) {
                    l++;
                }
                while (r >= l && !isCharacterOrNumber(charArray[r])) {
                    r--;
                }
            }
        }
        return true;
    }

    public static boolean isCharacterOrNumber(char c) {
        // 小写字母的 acsii 码范围 97 ~ 122
        if (c >= 97 && c <= 122) {
            return true;
        } // 数字的 acsii 码范围 48 ~ 57
        else if (c >= 48 && c <= 57){
            return true;
        } else {
            return false;
        }
    }

    public static void main(String[] args) {
//        String s = "A man, a plan, a canal: Panama";
//        String s = "abcdcba";
//        String s = ".,";
        String s = "0P";
        System.out.println(s.length());
        System.out.println(isPalindrome(s));

        System.out.println('Z' == 90);
    }
}
